function buy(name,cb) {
		setTimeout(() => {
			cb && cb(null, 'content:' + name)
		}, 5)
	}

	// 1.这里的方式是 err first 的回调处理
	// buy('cai',function (err,content) {
	// 	console.log(content)
	// })
	function buyPromise(name) {
		return new Promise((resolve, reject) => {
			buy(name, function(err,content) {
				if (err) {
					reject()
				}
				resolve(content)
			})
			
		})
	}

	// 2.这里是 基于 promise 的方式处理
	// buyPromise('cai')
	// 	.then(res => {
	// 		return buyPromise('paomian')
	// 		console.log('content:::',res)
	// 	})
	// 	.then(res => {
	// 		return buyPromise('huotuichang')
	// 		console.log('content:::',res)
	// 	})
	
	// 3.这里引入 Generators 形式的异步, 通过 Generators 的方式来调用异步

	// function* buyGenerators(name) {
	// 	yield buyPromise(name)
	// }

	//let buyTask = buyGenerators('cai')
	// 这里的value 是一个promise对象
	//console.log(buyTask.next().value)
	// buyTask.next().value.then(res => {
	// 	console.log('content:::',res)
	// })

	function* buyAmountGenerators() {
		var caiVal = yield buyPromise('cai')
		var paomianVal = yield buyPromise('paomian' + caiVal)
		var huotuichangVal = yield buyPromise('huotuichang' + paomianVal)
	}

	// const handler = buyAmountGenerators()
	// handler.next().value.then(res => {
	// 	console.log('cai_content::::', res)
	// 	handler.next(res).value.then(res => {
	// 		console.log('paomian_content::::', res)
	// 		handler.next(res).value.then(res => {
	// 			console.log('huotuichang_content::::', res)
	// 		})
	// 	})
	// })

	// 因为以上的形式太过麻烦，需要不断的调用 next() 方法，所以我们写一个自执行函数方法
	// 自动调用 Generator 函数
	function runGenerators(handler) {
		return Promise.resolve()
			.then(function nextAction(value){
				const next = handler.next(value)
				if (next.done) {
					return value
				}
				return Promise.resolve(next.value).then(nextAction)
			})
	}
	//console.log('value:::::',runGenerators(buyAmountGenerators()))
	// runGenerators(buyAmountGenerators()).then(finalRes => {
	// 	console.log('finalRes:::', finalRes)
	// })
	const co = require('co')
	console.log(co(buyAmountGenerators))